﻿// -----------------------------------------------------------------------
// <copyright file="GerenciadorServicoEspecialidadeTemp.cs" company="">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace Service
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Persistence;
    using Model;
    using Persistence;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class GerenciadorServicoEspecialidadeTemp
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorServicoEspecialidadeTemp()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorServicoEspecialidadeTemp(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="servico">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(ServicoEspecialidadeTempModel servicoesptemp)
        {
            tb_servico_especialidade_temp servicoesptempE = new tb_servico_especialidade_temp();
            Atribuir(servicoesptemp, servicoesptempE);
            unitOfWork.RepositorioTemp.Inserir(servicoesptempE);
            unitOfWork.Commit(shared);
            return servicoesptempE.id_servico_especialidade_temp;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="servico"></param>
        public void Editar(ServicoEspecialidadeTempModel servicoesptemp)
        {
            tb_servico_especialidade_temp servicoesptempE = new tb_servico_especialidade_temp();
            Atribuir(servicoesptemp, servicoesptempE);
            unitOfWork.RepositorioTemp.Inserir(servicoesptempE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="servico"></param>
        public void Remover(int IDServicoTemp)
        {
            unitOfWork.RepositorioTemp.Remover(servicoesptempE => servicoesptempE.id_servico_especialidade_temp.Equals(IDServicoTemp));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do Serviço como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<ServicoEspecialidadeTempModel> GetQuery()
        {
            IQueryable<tb_servico_especialidade_temp> tb_servico_especialidade_temp = unitOfWork.RepositorioTemp.GetQueryable();
            var query = from servicoesptempE in tb_servico_especialidade_temp
                        select new ServicoEspecialidadeTempModel
                        {
                            tservicotemp = servicoesptempE.id_servico_especialidade_temp,
                            tprestador = servicoesptempE.id_prestador,
                            tnomeser = servicoesptempE.temp_nome_servico,
                            tdescricao = servicoesptempE.temp_descricao_servico,
                            tvalor = servicoesptempE.temp_valor_servico,
                            tnomeesp = servicoesptempE.temp_nome_especialidade

                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<ServicoEspecialidadeTempModel> ObterTodos()
        {
            return GetQuery();
        }

        /// <summary>
        /// Obtém um Serviço
        /// </summary>
        /// <param name="id_servico">Identificador do serviço na base de dados</param>
        /// <returns>ServicoModel</returns>
        public ServicoEspecialidadeTempModel Obter(int IDServicoTemp)
        {
            IEnumerable<ServicoEspecialidadeTempModel> servicoTemp = GetQuery().Where(ServicoEspecialidadeTempModel => ServicoEspecialidadeTempModel.tservicotemp.Equals(IDServicoTemp));
            return servicoTemp.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do ServicoModel para o Servico Entity
        /// </summary>
        /// <param name="servico">Objeto do modelo</param>
        /// <param name="serE">Entity mapeada da base de dados</param>
        private void Atribuir(ServicoEspecialidadeTempModel servicoTemp, tb_servico_especialidade_temp servicoespTempE)
        {
            servicoespTempE.id_servico_especialidade_temp =   servicoTemp.tservicotemp;
                            servicoespTempE.id_prestador = servicoTemp.tprestador;
                            servicoespTempE.temp_nome_servico = servicoTemp.tnomeser;
                            servicoespTempE.temp_descricao_servico = servicoTemp.tdescricao;
                            servicoespTempE.temp_valor_servico = servicoTemp.tvalor;
                            servicoespTempE.temp_nome_especialidade = servicoTemp.tnomeesp;

        }
    }
}
